package sicnu.cs.ich.security.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.swagger.models.auth.In;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import sicnu.cs.ich.api.common.annotations.transaction.EncryptTransaction;
import sicnu.cs.ich.api.domain.entity.UserInfo;
import sicnu.cs.ich.api.domain.form.PageParam;
import sicnu.cs.ich.api.domain.form.UserForm;
import sicnu.cs.ich.api.domain.form.WechatUserForm;
import sicnu.cs.ich.api.domain.vo.UserVo;
import sicnu.cs.ich.security.domain.entity.User;


import java.util.List;
import java.util.Optional;


@Mapper
public interface UserMapper extends BaseMapper<User> {

    /**
     * 查询username的数量
     *
     * @param username username
     * @return 数量
     */
    long countByUsername(@Param("username") String username);


    /**
     * 查询email数量
     *
     * @param email email
     * @return 数量
     */
    long countByEmail(@EncryptTransaction @Param("email") String email);

    /**
     * 查询手机号数量
     *
     * @param mobile 手机号
     * @return 数量
     */
    long countByMobile(@EncryptTransaction @Param("mobile") String mobile);

    /**
     * 查询用户id的数量
     *
     * @param id 用户id
     * @return 数量
     */
    long countByUserId(@Param("id") Integer id);

    /**
     * 根据username 查找对应的用户
     *
     * @param username 用户名
     * @return 用户实体
     */
    Optional<User> findOptionalByUsername(@Param("username") String username);

    /**
     * 根据邮箱查找对应用户
     *
     * @param email 邮箱
     * @return 用户实体
     */
    Optional<User> findOptionalByEmail(@EncryptTransaction @Param("email") String email);

    /**
     * 根据邮箱查找对应用户
     *
     * @param userId 用户id
     * @return 用户实体
     */
    Optional<User> findOptionalByUserId(@Param("userId") Integer userId);

    /**
     * 插入用户
     *
     * @param user 用户
     * @return 改变行数
     */
    int insertUser(UserForm user);


    /**
     * 更新密码
     *
     * @param userId   用户id
     * @param password 新密码
     */
    int updatePassword(@Param("userIds") Integer[] userId, @Param("password") String password);

    /**
     * 更新用户邮箱
     *
     * @param userId 用户id
     * @param email  邮箱
     * @return 更新条数
     */
    int updateEmail(Integer userId, @EncryptTransaction String email);

    /**
     * 查找密码
     *
     * @param userId 用户id
     * @return 返回密码
     */
    String findPassword(Integer userId);


    int updateUser(User user);

    List<UserVo> findUserVos(PageParam param);

    /**
     * 获取用户
     */
    UserVo findUserVo(@Param("userId") Integer userId);
    /**
     * 修改账号锁定状态
     */
    int updateUserLockState(@Param("userId") Integer userId , @Param("lockState") Integer lockState);


    /**
     * 更新用户状态

     */
    int updateUserCertStatus(@Param("userId") Integer userId,@Param("certified") Integer certified);

    /**
     * 修改用户实名认证信息
     */
    int updateUserCertInfo(@Param("userId") Integer userId,@Param("realName") String realName,@Param("idNumber") @EncryptTransaction String idNumber);

    /**
     * 默认初始化为 ROLE_PERSON
     */
    int initUserRole(@Param("ids") List<Integer> ids);

    List<Integer> findUserIdByRole(@Param("roleId") Integer roleId);

    /**
     * 根据openId获取用户
     */
    User findUserByOpenId(String openid);

    /**
     * 微信用户生成
     */
    int initWechatUser(WechatUserForm userForm);
}
